package hash.medium;

import java.util.HashMap;
import java.util.Map;

/**
 * 无重复字符的最长子串
 *
 * 示例 1:
 *
 * 输入: s = "abcabcbb"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
 * 示例 2:
 *
 * 输入: s = "bbbbb"
 * 输出: 1
 * 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
 * 示例 3:
 *
 * 输入: s = "pwwkew"
 * 输出: 3
 * 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
 *      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
 * 示例 4:
 *
 * 输入: s = ""
 * 输出: 0
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
 */
public class LongestSubstringWithoutRepeatingCharacters_3 {

    public int lengthOfLongestSubstring(String s) {
        Map<String, Integer> map = new HashMap<>();

        int cnt = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.toCharArray().length; i++) {
            char c = s.charAt(i);
            if (sb.indexOf(Character.toString(c)) != -1) {
                do {
                    sb.delete(0, 1);
                } while (sb.indexOf(Character.toString(c)) != -1);
            }
            sb.append(c);
            map.put(sb.toString(), sb.length());
            cnt = Math.max(map.get(sb.toString()), cnt);
        }
        return cnt;
    }

    public static void main(String[] args) {
        LongestSubstringWithoutRepeatingCharacters_3 lsw = new LongestSubstringWithoutRepeatingCharacters_3();
        System.out.println(lsw.lengthOfLongestSubstring("abcabcbb"));
//        StringBuilder sb = new StringBuilder("abcs");
//        char c = 'a';
//        sb.delete(0, 1);
//        System.out.println(sb.toString());
    }
}
